package com.itany.corejava.util;

import com.itany.corejava.constant.DateutilConstant;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;

/**
 * @author MissChen
 * @date 2024年03月01日 16:27
 * 定义一个日期的工具类DateUtil
 * 1.将指定日期转换成指定格式的字符串格式
 * 2.将指定日期转换成默认式的字符串格式
 * 3.将一个字符串按照指定格式转换成日期(2个参数)
 * 4.将一个字符串按照默认格式转换成日期(1个参数)
 * 5.计算指定日期的前一天(1个参数)
 * 6.计算指定日期的下一天(1个参数)
 * 7.计算两个日期之间相差的天数(2个参数)
 * 8.获取指定日期中指定的年、月、日、时、分、秒的值
 * （2个参数，考虑第二个参数仅获取年或者月或者日或时或者分或者秒的值）
 *9.根据指定的年份与月份，获取这一年的这个月有多少天
 *
 */
public class DateUtil {

    /**
     *
     * @param date 需要转换的日期
     * @param pattern 指定的字符串格式
     * @return 转换后的字符串
     */
    public static String dateToString(Date date,String pattern){
        return new SimpleDateFormat(pattern).format(date);
    }

    /**
     *
     * @param date 需要转换的日期
     * @return 转换后的字符串
     */
    public static String dateToString(Date date){
        return new SimpleDateFormat(DateutilConstant.DATE_DEFAULT_PATTERN).format(date);
    }

    /**
     * 将一个字符串按照指定格式转换成日期
     * @param str 需要转换的字符串
     * @param pattern 指定字符串的格式
     * @return 转换后的日期
     * @throws ParseException
     */
    public static Date stringToDate(String str,String pattern) throws ParseException {
        return new SimpleDateFormat(pattern).parse(str);
    }

    /**
     * 将一个默认格式的字符串转换成日期
     * @param str 需要转换的字符串
     * @return 转换后的日期
     * @throws ParseException
     */
    public static Date stringToDate(String str) throws ParseException {
        return stringToDate(str,DateutilConstant.DATE_DEFAULT_PATTERN);
    }

    /**
     * 获取指定日期的前一天
     * @param date 指定日期
     * @return 返回指定日期的前一天
     */
    public static Date getYesterday(Date date){
        long time=date.getTime()-DateutilConstant.ONE_DAY_MILLISECONDS;
        return new Date(time);
    }

    /**
     * 获取指定日期的下一天
     * @param date 指定日期
     * @return 返回指定日期的下一天
     */
    public static Date getNextDay(Date date){
        long time=date.getTime()+DateutilConstant.ONE_DAY_MILLISECONDS;
        return new Date(time);
    }

    /**
     * 计算两个日期之间相差的天数
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 相差的整数天数
     */
    public static int getDuringDay(Date startDate,Date endDate){
        //计算两个日期之间相差的毫秒值
       long time=endDate.getTime()-startDate.getTime();
       int day= (int)(time/DateutilConstant.ONE_DAY_MILLISECONDS);
       return day;
    }

    public static int get(Date date,int field){
        //将日期转换成默认格式的字符串
        String s=dateToString(date);
        // 当前日期格式:yyyy-MM-dd HH:mm:ss
        String[] arr=s.split("[-\\s:]");
        System.out.println(Arrays.toString(arr));
        return Integer.parseInt(arr[field]);

    }

    /**
     *
     * @param year 指定的年份
     * @param month 指定的月份
     * @return 返回的当月天数
     */
    public static int getDay(int year,int month){//2024  3
        //将日期调整为正确日期
        Calendar calendar=Calendar.getInstance();
        calendar.set(Calendar.YEAR,year);
        calendar.set(Calendar.MONTH,month);//0-11
        calendar.set(Calendar.DATE,0);
        return calendar.get(Calendar.DATE);

    }

    /**
     *
     * @param year 指定的年份
     * @param month 指定的月份
     * @return 返回的当月天数
     */
    public static int getDay2(int year,int month){//2024  3
        Calendar calendar=Calendar.getInstance();

        //设置年份
        calendar.set(Calendar.YEAR,year);
        calendar.set(Calendar.MONTH,month-1);
        return calendar.getActualMaximum(Calendar.DATE);

    }


}
